# 傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用2D 离散傅里叶变换(DFT) 分析图像的频域特性。实现DFT 的算法叫做快速傅里叶变换（FFT）。
# 低通滤波将高频部分去除，实现方式是构建一个掩模，与低频区域对应的地方设置为1, 与高频区域对应的地方设置为0。按照下列步骤完成图像的低通滤波，
# 并显示原始图像和目标图像（35分）
# （14）导入必要的工具包
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# （15）读入原始图像文件football.jpg
img = cv.imread('images/football.jpg', cv.IMREAD_GRAYSCALE)
H, W = img.shape
H2 = H // 2
W2 = W // 2

# （16）调用函数cv2.dft（）完成原始图像傅里叶变换
img_f32 = img.astype(np.float32)
f = cv.dft(img_f32, flags=cv.DFT_COMPLEX_OUTPUT)

# （17）将低频直流平移到图片中心位置
fshift = np.fft.fftshift(f)

# （18）调用函数cv2.magnitude（）计算幅度频谱
spectrum = np.log(cv.magnitude(fshift[:, :, 0], fshift[:, :, 1]))

# （19）在频域中心位置设置50X50方框的低通滤波器
HALF_SIZE = 50 // 2
mask = np.zeros((*img.shape, 2), dtype=np.float32)
mask[H2 - HALF_SIZE:H2 + HALF_SIZE, W2 - HALF_SIZE:W2 + HALF_SIZE] = 1.
fshift *= mask

# （20）中心位置再平移返回左上角
f_inv = np.fft.ifftshift(fshift)

# （21）调用傅里叶逆变换函数cv2.idft（）完成目标图像
dst = cv.idft(f_inv)
dst = cv.magnitude(dst[:, :, 0], dst[:, :, 1])

# （22）显示原始图像和目标图像
spr = 2
spc = 2
spn = 0
plt.figure(figsize=(6, 6))
imgs_arr = [img, spectrum, dst]
titles_arr = ['Original', 'Spectrum', 'Destination']
for im, ti in zip(imgs_arr, titles_arr):
    spn += 1
    plt.subplot(spr, spc, spn)
    plt.axis('off')
    plt.title(ti)
    plt.imshow(im, cmap='gray')
plt.show()
